﻿#define _CRT_SECURE_NO_WARNINGS 1

#include"SeqList.h" 
 
void SLInit(SL* ps)		//要传地址
{
	//最好开辟一点空间
	/*ps->a = NULL;
	ps->size = 0;
	ps->capacity = 0;*/    
	ps->a = (SLDateType*)malloc(sizeof(SLDateType) * 4);
	if(ps->a == NULL)
	{
		perror("malloc failed");	
		exit(-1);	//终止程序
	}
	ps-> size = 0;
	ps->capacity = 4 ;	 
}

void SLDestroy(SL* ps)
{
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}

//这样用函数ok？
//void AddCapacity(SL* tmp)
//{
//	(SLDateType*)realloc(tmp->a, tmp->capacity * 2 * (sizeof(SLDateType)));
//	if (tmp->a == NULL)
//	{
//		perror("malloc failed");
//		exit(-1);
//	}
//}

void SLPushBack(SL* ps, SLDateType x)
{
	//满了扩容
	SLCheckCapacity(ps);
	ps->a[ps->size] = x;
	ps->size++;
}

void SLPrint(SL* ps)
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

void SLPopBack(SL* ps)
{
	//温柔的检查
	//if (ps->size == 0)
	//	return;

	//暴力检查
	assert(ps->size > 0);

	ps->size--;		//越界不一定报错 
}

void SLCheckCapacity(SL* ps)
{
	if (ps->size == ps->capacity)
	{
		SLDateType* tmp = (SLDateType*)realloc(ps->a, ps->capacity * 2 * (sizeof(SLDateType)));
		if (tmp == NULL)
		{
			perror("malloc failed");
			exit(-1);
		}
		ps->a = tmp;
		ps->capacity *= 2;
	}
}

void SLPushFront(SL* ps, SLDateType x)
{
	SLCheckCapacity(ps);
	//挪动数据
	/*for(int i = ps->size;i > 0;i-- )*/
	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->a[end + 1] = ps->a[end];
		--end;
	}
	ps->a[0] = x;
	ps->size++;
}

void SLPopFront(SL* ps)
{
	for (int i = 1; i < ps->size; i++)
	{
		ps->a[i - 1] = ps->a[i];
	}
	ps->size--;
}

void SLInsert(SL* ps, int pos, SLDateType x)
{
	SLCheckCapacity(ps);
	int end = ps->size - 1;
	while (end >= pos -1)
	{
		ps->a[end + 1] = ps->a[end];
		--end;
	}
	ps->a[pos-1] = x;
	ps->size++;

}

void SLErase(SL* ps, int pos)
{
	for (int i = pos; i < ps->size; i++)
	{
		ps->a[i - 1] = ps->a[i];
	}
	ps->size--;
}


//参考

//#include "SeqList.h"
//
//void SeqListInit(SeqList* ps)
//{
//	assert(ps);
//
//	ps->a = NULL;
//	ps->size = 0;
//	ps->capacity = 0;
//}
//
//void SeqListDestroy(SeqList* ps)
//{
//	assert(ps);
//	free(ps->a);
//	ps->a = NULL;
//	ps->size = ps->capacity = 0;
//}
//
//void SeqListPrint(SeqList* ps)
//{
//	assert(ps);
//
//	for (inti = 0; i < ps->size; ++i)
//	{
//		printf("%d ", ps->a[i]);
//	}
//
//	printf("%\n");
//}
//
//void CheckCacpity(SeqList* ps)
//{
//	if (ps->size == ps->capacity)
//	{
//		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
//		ps->a = (SLDateType*)realloc(ps->a, newcapacity * sizeof(SLDateType));
//		ps->capacity = newcapacity;
//	}
//}
//
//// 以下几个接口先讲不复用Insert和Erase的实现，最后再讲复用实现
//void SeqListPushBack(SeqList* ps, SLDateType x)
//{
//	//assert(ps);
//	//CheckCacpity(ps);
//
//	//ps->a[ps->size] = x;
//	//ps->size++;
//
//	SeqListInsert(ps, ps->size, x);
//}
//
//void SeqListPushFront(SeqList* ps, SLDateType x)
//{
//	assert(ps);
//
//	/*CheckCacpity(ps);
//
//	int end = ps->size;
//	while (end > 0)
//	{
//		ps->a[end] = ps->a[end - 1];
//		--end;
//	}
//
//	ps->a[0] = x;
//	++ps->size;*/
//
//	SeqListInsert(ps, 0, x);
//}
//
//void SeqListPopFront(SeqList* ps)
//{
//	assert(ps);
//
//	//int start = 0;
//	//while (start < ps->size-1)
//	//{
//	//	ps->a[start] = ps->a[start + 1];
//	//	++start;
//	//}
//	//int﻿ start = 1;
//	//while (start < ps->size)
//	//{
//	//	ps->a[start-1] = ps->a[start];
//	//	++start;
//	//}
//
//	//--ps->size;
//	SeqListErase(ps, 0);
//}
//
//void SeqListPopBack(SeqList* ps)
//{
//	assert(ps);
//
//	//ps->a[ps->size - 1] = 0;
//	//ps->size--;
//	SeqListErase(ps, ps->size - 1);
//}
//
//int SeqListFind(SeqList* ps, SLDateType x)
//{
//	for (int i = 0; i < ps->size; ++i)
//	{
//		if (ps->a[i] == x)
//		{
//			return i;
//		}
//	}
//
//	return -1;
//}
//
//// 顺序表在pos位置插入x
//void SeqListInsert(SeqList* ps, size_t pos, SLDateType x)
//{
//	assert(ps);
//	assert(pos <= ps->size);
//
//	CheckCacpity(ps);
//
//	//int end = ps->size - 1;
//	//while (end >= pos)
//	//{
//	//	ps->a[end + 1] = ps->a[end];
//	//	--end;
//	//}
//
//	int end = ps->size;
//	while (end > pos)
//	{
//		ps->a[end] = ps->a[end - 1];
//		--end;
//	}
//
//
//	ps->a[pos] = x;
//	ps->size++;
//}
//
//// 顺序表删除pos位置的值
//void SeqListErase(SeqList* ps, int pos)
//{
//	assert(ps && pos < ps->size);
//
//	//int start = pos;
//	//while (start < ps->size-1)
//	//{
//	//	ps->a[start] = ps->a[start + 1];
//	//	++start;
//	//}
//
//	int start = pos + 1;
//	while (start < ps->size)
//	{
//		ps->a[start - 1] = ps->a[start];
//		++start;
//	}
//
//	ps->size--;
//}